// 输入格式：每个时钟都输入一个8bit数据，且en和data对齐
// 结果:整体延迟2拍
module bit8_bit16 (
    input               clk         ,
    input               rst_n       ,
    input               data_8b_en  ,
    input       [ 7:0]  data_8b     ,
    output              data_16b_en ,
    output reg  [15:0]  data_16b    
);
// reg define
reg [7:0] cnt;
reg [1:0] data_en_8b_d;
// wire define
wire [7:0] data_16b_w1, data_16b_w2;
//              main code
// 计数
always @(posedge clk or negedge rst_n) begin
    if(~rst_n)
        cnt <= 8'd0;
    else if(data_8b_en)
        cnt <= cnt + 8'd1;
end

// 输出
// data_16b输出
assign data_16b_w1 = cnt[0] ? data_8b : data_16b_w1;
assign data_16b_w2 = cnt[0] ? data_16b_w2 : data_8b;
always @(posedge clk or negedge rst_n) begin 
    if(~rst_n)
        data_16b <= 16'd0;
    else begin
        if(cnt[0])
            data_16b <= {data_16b_w2, data_16b_w1};
        else ;
    end
end

// data_16b_en输出
assign data_16b_en = data_en_8b_d[1];
always @(posedge clk or negedge rst_n) begin
    if(~rst_n)
        data_en_8b_d <= 2'd0;
    else 
        data_en_8b_d <= {data_en_8b_d[0], data_8b_en};
end
endmodule